#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<assert.h>

int main()
{
    // 下面的代码体现进程等待的意义
    // 以及waitpid函数的使用
    /* 主要功能就是子进程退出的时候返回一个进程退出码0，但是此时父进程在执行sleep函数
无法回收处于Z状态的子进程，而后waitpid函数就会回收子进程资源*/

    pid_t id = fork();
    assert(id != -1); // id不能是-1，-1就是创建子进程失败
    if(id == 0)
    {
        // 子进程
        int cnt = 5;
        while(cnt)
        {
            printf("子进程pid:%d, 父进程pid:%d, cnt:%d\n", getpid(), getppid(), cnt--);
            sleep(1);
        }
        //int a = 1;
        //a/=0;
        exit(10);    
    }

    // 父进程
    sleep(10);
    int status = 0; //status不是被整体使用的，它有位图结构
    pid_t ret = waitpid(id, &status, 0); // 这里的id其实就是父进程的pid
    if(id > 0)
    {
        // 这里可以使用宏来降低status的使用成本
        if(WIFEXITED(status)) // 判断子进程是否正常退出
        {
            // 获取子进程运行结果
            printf("exit code: %d\n", WEXITSTATUS(status));
        }
        else
        {
            printf("子进程异常退出\n");// 异常
        }
    }
    
    sleep(2);
    return 0;
}
